package reflect;

import io.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URISyntaxException;

/**
 * 调用与当前类Test3所在同一个包中哪些类中名字含有s的无参方法.
 */
public class Test3 {
    public static void main(String[] args) throws Exception {
        File dir = new File(
                Test3.class.getResource(".").toURI()
        );
        //根据Test3.class所在的目录获取其所有子项
//        File[] files = dir.listFiles(new FileFilter() {
//            public boolean accept(File file) {
//                return file.getName().endsWith(".class");
//            }
//        });
        //lambda表达式
        File[] files = dir.listFiles(file->file.getName().endsWith(".class"));
        for (File sub : files) { //循环遍历所有文件
            String line =dir.getName()+"."+sub.getName().substring(0, sub.getName().indexOf("."));
            Class cla = Class.forName(line);//获取类对象
            Object obj = cla.newInstance();//将类对象实例化
            //获取本类所有的方法(包含超类的)储存到methods数组中
            Method[] methods = cla.getDeclaredMethods();
            for (Method method : methods){ //遍历methods中的每一个元素
                System.out.println(method.getName());
                if (method.getParameterCount()==0 //参数个数等于0
                        &&
                        method.getModifiers()==Modifier.PUBLIC  //public声明的
                        &&
                        (method.getName().contains("S")||method.getName().contains("s"))//包含"s"或包含"S"的
                ){
                    method.invoke(obj);//执行方法
                }
            }
        }








    }
}
